package com.market.controller;

import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaIgnore;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.bean.BeanUtil;
import com.market.constants.ResultCode;
import com.market.entity.ProductOrder;
import com.market.exception.ServiceException;
import com.market.model.dto.ProductOrderDto;
import com.market.model.dto.ProductOrderEvaluateDto;
import com.market.model.dto.ProductOrderPostDto;
import com.market.service.ProductOrderService;
import com.market.model.R;
import entity.AiProductOrderDto;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 商品订单控制器
 * 用于处理与商品订单相关的所有HTTP请求，包括创建订单、查询订单详情、修改订单状态等
 * 所有接口需要用户登录才能访问
 */
@RestController
@RequestMapping("/product/order")
//@SaCheckLogin
public class ProductOrderController {
  @Autowired
  private ProductOrderService productOrderService;
  
  /**
   * 创建商品订单
   * @param dto 订单数据传输对象，包含商品ID、订单信息、地址、姓名、电话等
   * @return 返回创建的订单ID
   */
  @PostMapping
  public R<String> createOrder(@RequestBody ProductOrderDto dto){
    String id = productOrderService.createOrder(dto.getProductId(), dto.getInfo(), dto.getAddress(), dto.getIdname(), dto.getPhone());
    return R.ok(id);
  }


  
  /**
   * 获取订单详情
   * @param productOrderId 订单ID
   * @return 返回订单详细信息的映射
   */
  @GetMapping("detail")
  public R<Map> getOrderDetail(String productOrderId){
   Map map = productOrderService.getOrderDetail(productOrderId);
   return R.ok(map);
  }
  
  /**
   * 获取订单基本信息
   * @param productOrderId 订单ID
   * @return 返回订单基本信息
   */
  @GetMapping
  public R<ProductOrder> getProductOrderInfo(String productOrderId){
    ProductOrder productOrder = productOrderService.getById(productOrderId);
    if(BeanUtil.isEmpty(productOrder)) throw new ServiceException(ResultCode.NotFindError);
    return R.ok(productOrder);
  }
  
  /**
   * 获取用户订单统计信息
   * @return 返回用户订单统计数据
   */
  @GetMapping("/stat")
  public R<Map> getUserOrderStat(){
    HashMap<String,String> map = productOrderService.getUserOrderStat();
    return R.ok(map);
  }
  
  /**
   * 获取当前用户卖出的订单列表
   * @return 返回卖出订单列表
   */
  @GetMapping("/my/sell")
  public R<List<ProductOrder>> getMySellOrder(){
    List<ProductOrder> list =  productOrderService.getMySellOrder();
    return R.ok(list);
  }
  
  /**
   * 获取当前用户购买的订单列表
   * @return 返回购买订单列表
   */
  @GetMapping("/my/buy")
  public R<List<ProductOrder>> getMyBuyOrder() {
    List<ProductOrder> list = productOrderService.getMyBuyOrder();
    return R.ok(list);
  }
  
  /**
   * 用户自提操作
   * 将订单状态从待提货(4)更新为已完成(9)
   * @param productOrderId 订单ID
   * @return 操作结果
   */
  @ApiOperation("用户提货")
  @PutMapping("/user/self/{productOrderId}")
  public R userSelf(@PathVariable("productOrderId") String productOrderId){
    boolean update = productOrderService.lambdaUpdate().eq(ProductOrder::getId, productOrderId)
      .eq(ProductOrder::getDealStatus, 4)
      .eq(ProductOrder::getPostMode, "用户自提")
      .set(ProductOrder::getDealStatus, 9).update();
    if(!update) throw new ServiceException(ResultCode.UpdateError);
    return R.ok();
  }
  
  /**
   * 卖家发货操作（物流发货模式）
   * 将订单状态从待发货(3)更新为待收货(4)，并记录物流信息
   * @param dto 包含订单ID、物流公司、物流单号等信息
   * @return 操作结果
   */
  @ApiOperation("物流发货")
  @PutMapping("/post")
  public R post(@RequestBody ProductOrderPostDto dto){
    boolean update = productOrderService.lambdaUpdate()
      .eq(ProductOrder::getId, dto.getProductOrderId())
      .eq(ProductOrder::getDealStatus, 3)
      .eq(ProductOrder::getPostMode, "物流发货")
      .set(ProductOrder::getDealStatus, 4)
      .set(ProductOrder::getShipCompany, dto.getPostCompany())
      .set(ProductOrder::getShipNum, dto.getPostNum())
      .set(ProductOrder::getShipTime, new Date()).update();
    if (!update) throw new ServiceException(ResultCode.UpdateError);
    return R.ok();
  }
  
  /**
   * 上传自提地址信息
   * 将订单状态从待发货(3)更新为待提货(4)，并记录提货地址信息
   * @param dto 包含订单ID、联系人、电话、地址等信息
   * @return 操作结果
   */
  @ApiOperation("上传提货地址")
  @PutMapping("/selfPost")
  public R selfPost(@RequestBody ProductOrderPostDto dto) {
    boolean update = productOrderService.lambdaUpdate()
      .eq(ProductOrder::getId, dto.getProductOrderId())
      .eq(ProductOrder::getDealStatus, 3)
      .eq(ProductOrder::getPostMode, "用户自提")
      .set(ProductOrder::getDealStatus, 4)
      .set(ProductOrder::getShipUsername, dto.getUsername())
      .set(ProductOrder::getShipPhone, dto.getPhone())
      .set(ProductOrder::getShipAddress, dto.getAddress())
      .set(ProductOrder::getShipTime, new Date()).update();
    if (!update) throw new ServiceException(ResultCode.UpdateError);
    return R.ok();
  }
  
  /**
   * 确认收货操作
   * 将订单状态从待收货(4)更新为已完成(9)
   * @param productOrderId 订单ID
   * @return 操作结果
   */
  @ApiOperation("确认收货")
  @PutMapping("/post/confirm/{productOrderId}")
  public R confirmPost(@PathVariable("productOrderId") String productOrderId){
    boolean update = productOrderService.lambdaUpdate()
      .eq(ProductOrder::getId, productOrderId)
      .eq(ProductOrder::getDealStatus, 4)
      .eq(ProductOrder::getPostMode, "物流发货")
      .set(ProductOrder::getDealStatus, 9)
      .set(ProductOrder::getShipTime, new Date()).update();
    if (!update) throw new ServiceException(ResultCode.UpdateError);
    return R.ok();
  }
  
  /**
   * 订单评价
   * 将订单状态从已完成(9)更新为已评价(11)，并记录评分和评价内容
   * @param dto 包含订单ID、评分、评价内容等信息
   * @return 操作结果
   */
  @ApiOperation("评价")
  @PutMapping("/evaluate")
  public R evaluate(@RequestBody ProductOrderEvaluateDto dto){
    productOrderService.lambdaUpdate().eq(ProductOrder::getId, dto.getId())
      .eq(ProductOrder::getUserId, StpUtil.getLoginIdAsString())
      .eq(ProductOrder::getDealStatus, 9)
      .set(ProductOrder::getEvaScore, dto.getScore())
      .set(ProductOrder::getEvaContent, dto.getContent())
      .set(ProductOrder::getDealStatus, 11)
      .set(ProductOrder::getUpdateTime, new Date()).update();
    return R.ok();
  }
  /**
   * 创建商品订单
   * @param dto 订单数据传输对象，包含用户ID,商品ID、订单信息、地址、姓名、电话等
   * @return 返回创建的订单ID
   */
  @SaIgnore
  @PostMapping("/create/order")
  public R<String> aiCreateOrder(@RequestBody AiProductOrderDto dto){
    String id = productOrderService.aiCreateOrder(dto.getUserId(),dto.getProductId(), dto.getInfo(), dto.getAddress(), dto.getIdname(), dto.getPhone());
    return R.ok(id);
  }
}
